<?
// Инициализация теста

function atest_mod_access($level)
{   // Возврощает списко тестовых функций
    switch ($level)
    {
        case 'unit':
            // Функции модульного тестирования
            // (изолированный функционал)
            return array();
        break;
        case 'func':
            // Функции функционального тестирования
            // Приемочнгое тестирование
            return array('atest_mod_access_func_t1');
        break;

    }
}



function atest_mod_access_func_t1()
{   // Тестируем работу стандартных вызовов

    $ok = true;
	$pretime = $start = microtime(true);
    echo '<pre>';
    $test_user_id = 2;
    // Получаем id группы или создаем новую
    $id = access_save_groupcode('atest_test1','access','Проверка 1'); //= access_get_groupid('atest_test1','access');
/*
    if (!$id)
    {
        $id = access_add_group('Проверка 1','atest_test1','access');
    }
  */  
    // Проверяем id группы администратора
    $id1 = access_save_groupcode('administrators',null,'Администраторы системы');
    $id2 = access_save_groupcode('administrators',null,'Администраторы системы');
    if ($id1 !== $id2)
    {
        $ok = false;
	    echo "\nОшибка: система неправильно распознает группы с кодом Null: {$id1}!={$id2}\n";
    }
    
    // Добавляем пользователя в группу
    echo "\nДобавляем пользователя в группу";
    access_save_user2groupid($test_user_id,$id);
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    
    // Задаем права доступа
    echo "\nЗадаем права доступа пользователя к группе"; 
	access_save_permission2item('user',$test_user_id,'group',$id,array('view'=>1,'read'=>1,'modify'=>0));
	echo "\n".round(($pretime = microtime(true)) - $pretime,6);
	echo "\nПолучаем права доступа пользователя к группе";
	$perm = access_get_permission('user',$test_user_id,'group',$id);
	if ($perm['view']!==1 
	        OR $perm['view']!==1
	        OR $perm['read']!==1
	        OR $perm['modify']!==0
	        OR $perm['delete']!==0
	        OR $perm['create']!==0
	        OR $perm['own']!==0)
	{
	    $ok = false;
	    echo "\nОшибка1: из базы получены неверные разрешения:\n";
	    print_r($perm);
	}
	echo "\n".round(-$pretime+($pretime = microtime(true)),6);
	
	echo "\nЗадаем права доступа пользователя к группе";  
    access_save_permission2item('user',$test_user_id,'group',$id,array('view'=>1,'read'=>1,'modify'=>0,'own'=>1));
    $perm = access_get_permission('user',$test_user_id,'group',$id);
	if ($perm['view']!==1 
	        OR $perm['view']!==1
	        OR $perm['read']!==1
	        OR $perm['modify']!==0
	        OR $perm['delete']!==0
	        OR $perm['create']!==0
	        OR $perm['own']!==1)
	{
	    $ok = false;
	    echo "\nОшибка2: из базы получены неверные разрешения:\n";
	    print_r($perm);
	}
	echo "\n".round(-$pretime+($pretime = microtime(true)),6);
	// Добавляем привеллегии для группы

	echo "\nИзменяем права доступа пользователя к группе";
    access_save_permission2item('group',$id,'group',$id,array('delete'=>1));
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    // Проверяем, правильно ли считываются права
    echo "\nПроверяем, правильно ли считываются права доступа пользователя к объекту 'группа'";
    $perm['delete']=1;
    foreach ($perm as $p_name=>$p_value)
    {
        if(($p_a = access_isaccess2item('group',$id,$p_name,$test_user_id))!==($p_value===1))
        {
	        $ok = false;
	        echo "\nОшибка3: возвращены неправильные права доступа:\n";
	        
            echo "\n{$p_name}=";echo ($p_a===true)?('разрешено'):('запрещено');
            echo "\nЭталон:\n";
            print_r($perm);
        }    
    }
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    
    echo "\nИзменяем права доступа пользователя на пустые (запись должна автоматически удалиться)";
    access_save_permission2item('group',$id,'group',$id,array('delete'=>0));
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    
    // Создаем именованный объект
    echo "\nСоздаем именованный объект";
    $obj_named_id = access_save_namedobj('access','atest_test1');
    if (access_save_namedobj('access','atest_test1') !== $obj_named_id AND !is_int($obj_named_id) AND $obj_named_id<=0)
    {
        $ok = false;
	    echo "\nОшибка4: возвращенные id именованных объектов не совпадают или равны нулю"; 
    }
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    
    // Задаем права доступа пользователя 1 к именованному объекту
    echo "\nЗадаем права доступа пользователя 1 к именованному объекту";
    access_save_permission4user2nameobj($test_user_id,'access','atest_test1',$perm);
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    
    // Проверяем, правильно ли считываются права
    echo "\nПроверяем, правильно ли считываются права";
    foreach ($perm as $p_name=>$p_value)
    {
        if(($p_a = access_isaccess2nameobj('access','atest_test1',$p_name,$test_user_id))!==($p_value===1))
        {
	        $ok = false;
	        echo "\nОшибка5: возвращены неправильные права доступа:\n";
            var_dump($p_a);	        
            echo "\n{$p_name}=";echo ($p_a===true)?('разрешено'):('запрещено');
            echo "\nЭталон:\n";
            print_r($perm);
        }    
    }
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);
    
    // 
    echo "\nПроверяем комплексную работу с именованными объектами";
    access_save_permission4group2nameobj('atest_test2g','access','atest_test2o',array('view'=>1,'read'=>1));
    // "\nПроверяем права доступа для группы 'atest_test2g' к именованному объекту 'atest_test2o'";
    $group_id = access_get_groupid('atest_test2g','access');
    $nameobj_id = access_save_namedobj('access','atest_test2o');
	$perm3 = access_get_permission('group',$group_id,'obj_named',$nameobj_id);
	if (    $perm3['view']!==1
	        OR $perm3['read']!==1
	        OR $perm3['modify']!==0
	        OR $perm3['delete']!==0
	        OR $perm3['create']!==0
	        OR $perm3['own']!==0)
	{
	    $ok = false;
	    echo "\nОшибка6: из базы получены неверные разрешения:\n";
	    print_r($perm3);
	}    
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);

    echo "\nПроверяем доступ для администратора";
    // "\nПроверяем права доступа для группы 'atest_test2g' к именованному объекту 'atest_test2o'";
    $group_id = access_get_groupid('administrators',null);
    $nameobj_id = access_save_namedobj('access','atest_test2o');
    $perm_list = access_const_permissions();
    foreach ($perm_list as $p_name)
    {
        if(!access_isaccess2nameobj('access','atest_test1',$p_name,1))
        {
	        $ok = false;
	        echo "\nОшибка5: возвращены неправильные права доступа: администратору запрещено {$p_name}\n";
        }    
    }
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);

    
    echo "\nПроверяем, работу с ролями";
    // Получаем id роли или создаем новую
    $role_id = access_save_role('atest_test1','access','Проверка 1');
    $role_id2 = access_save_role('atest_test2','access','Проверка 2');
    // Назначаем пользователю роль
    access_save_user2roleid($test_user_id,$role_id,15);
    access_save_user2roleid($test_user_id,$role_id2,16);
    access_save_user2role($test_user_id,'atest_test3','Проверка 3',17);
    // echo $id;
    $roles = access_get_userroles($test_user_id,'access');
    if ($roles != array('atest_test3'=>'Проверка 3','atest_test2'=>'Проверка 2','atest_test1'=>'Проверка 1'))
    {
        $ok = false;
        echo "\nОшибка7: возворащен неправильный список ролей\n";
        print_r($roles);
    }
    // print_r();
    // Удаление информации о правах доступа пользователя
    // access_delete_user(11);
    // Удаление группы
    // access_delete_group_code('atest_test1','access');
    // Удаление именованного объекта
    // access_delete_item_named('atest_test2o','access');
    // Удаляем пользователя из группы
    // access_delete_userfromgroup(2,6);
    // access_delete_userfromgroup_named(2,'atest_test1','access');
    echo "\n".round(-$pretime+($pretime = microtime(true)),6);

    echo '</pre>';
    return $ok;
}
?>